1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #if UNITY_EDITOR
- using System.Linq;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.Rendering;
- namespace FlatKit {
- public static class SubAssetMaterial {
- public static Material GetOrCreate(Object settings, string shaderName) {
- // Return if called from OnValidate.
- {
- var stackTrace = new System.Diagnostics.StackTrace();
- var frames = stackTrace.GetFrames();
- if (frames != null) {
- if (frames.Select(frame => frame.GetMethod())
- .Any(method => method != null && method.Name == "OnValidate")) {
- return null;
- }
- }
- }
- var settingsPath = AssetDatabase.GetAssetPath(settings);
- var subAssets = AssetDatabase.LoadAllAssetsAtPath(settingsPath);
- const string subAssetName = "Effect Material";
- var existingMaterial = subAssets.FirstOrDefault(o => o.name == subAssetName) as Material;
- if (existingMaterial != null) return existingMaterial;
- var shader = Shader.Find(shaderName);
- if (shader == null) return null;
- var newMaterial = new Material(shader) { name = subAssetName };
- try {
- AssetDatabase.AddObjectToAsset(newMaterial, settings);
- AssetDatabase.ImportAsset(settingsPath);
- }
- catch {
- // ignored
- }
- return newMaterial;
- }
- public static void AlwaysInclude(string shaderName) {
- var shader = Shader.Find(shaderName);
- if (shader == null) return;
- var graphicsSettingsObj =
- AssetDatabase.LoadAssetAtPath<GraphicsSettings>("ProjectSettings/GraphicsSettings.asset");
- if (graphicsSettingsObj == null) return;
- var serializedObject = new SerializedObject(graphicsSettingsObj);
- var arrayProp = serializedObject.FindProperty("m_AlwaysIncludedShaders");
- bool hasShader = false;
- for (int i = 0; i < arrayProp.arraySize; ++i) {
- var arrayElem = arrayProp.GetArrayElementAtIndex(i);
- if (shader == arrayElem.objectReferenceValue) {
- hasShader = true;
- break;
- }
- }
- if (!hasShader) {
- int arrayIndex = arrayProp.arraySize;
- arrayProp.InsertArrayElementAtIndex(arrayIndex);
- var arrayElem = arrayProp.GetArrayElementAtIndex(arrayIndex);
- arrayElem.objectReferenceValue = shader;
- serializedObject.ApplyModifiedProperties();
- AssetDatabase.SaveAssets();
- }
- }
- }
- }
- #endif
|